/**
 *  Class Name : ParsePolicy
 *  Description : 인증서 데이터 파싱 클래스
 *  Modification Information
 * 
 *    수정일      	  수정자         수정내용
 *   ---------   ------   --------------------------
 *   2011.09.29  이주영         최초 생성
 *
 *  @author 통합앱 - 인증서 데이터 파서
 *  @since 2010.09.30
 *  @version 1.0
 * 
 *  Copyright (C) 2011 by (주)이타기술  All right reserved.
 */

package gov.mogaha.ntis.cmm.mob.servlet;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class ParsePolicy {

	private final static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.KOREA);

	/** 인증서 OID 값 */
	private static final String[] OID = {
		"1 2 410 100001 2 1 1",
		"1 2 410 100001 2 1 2",
		"1 2 410 100001 2 1 3",
		"1 2 410 100001 2 2 1",
		"1 2 410 200004 5 1 1 1",
		"1 2 410 200004 5 1 1 2",
		"1 2 410 200004 5 1 1 3",
		"1 2 410 200004 5 1 1 4",
		"1 2 410 200004 5 1 1 5",
		"1 2 410 200004 5 1 1 6",
		"1 2 410 200004 5 1 1 7",
		"1 2 410 200004 5 1 1 8",
		"1 2 410 200004 5 1 1 9",
		"1 2 410 200004 5 1 1 9 2",
		"1 2 410 200004 5 1 1 10",
		"1 2 410 200004 5 1 1 11",
		"1 2 410 200004 5 1 1 12",
		"1 2 410 200004 5 2 1 1",
		"1 2 410 200004 5 2 1 2",
		"1 2 410 200004 5 2 1 3",
		"1 2 410 200004 5 2 1 4",
		"1 2 410 200004 5 2 1 5",
		"1 2 410 200004 5 2 1 7 1",
		"1 2 410 200004 5 2 1 7 2",
		"1 2 410 200004 5 2 1 7 3",
		"1 2 410 200004 5 3 1 1",
		"1 2 410 200004 5 3 1 2",
		"1 2 410 200004 5 3 1 3",
		"1 2 410 200004 5 3 1 5",
		"1 2 410 200004 5 3 1 6",
		"1 2 410 200004 5 3 1 7",
		"1 2 410 200004 5 3 1 8",
		"1 2 410 200004 5 3 1 9",
		"1 2 410 200004 5 4 1 1",
		"1 2 410 200004 5 4 1 2",
		"1 2 410 200004 5 4 1 3",
		"1 2 410 200004 5 4 1 4",
		"1 2 410 200004 5 4 1 5",
		"1 2 410 200004 5 4 1 101",
		"1 2 410 200004 5 4 1 102",
		"1 2 410 200004 5 4 1 103",
		"1 2 410 200004 5 4 1 104",
		"1 2 410 200005 1 1 1",
		"1 2 410 200005 1 1 2",
		"1 2 410 200005 1 1 4",
		"1 2 410 200005 1 1 5",
		"1 2 410 200005 1 1 6",
		"1 2 410 200005 1 1 6 1",
		"1 2 410 200005 1 1 6 2",
		"1 2 410 200004 2 1",
		"1 2 410 200012 1 1 1",
		"1 2 410 200012 1 1 2",
		"1 2 410 200012 1 1 3",
		"1 2 410 200012 1 1 4",
		"1 2 410 200012 1 1 5",
		"1 2 410 200012 1 1 6",
		"1 2 410 200012 1 1 7",
		"1 2 410 200012 1 1 8",
		"1 2 410 200012 1 1 9",
		"1 2 410 200012 1 1 10",
		"1 2 410 200012 1 1 11",
		"1 2 410 200012 1 1 12",
		"1 2 410 200012 1 1 101",
		"1 2 410 200012 1 1 103",
		"1 2 410 200012 1 1 105",
		"1 2 410 100001 5 3 1 3"
	};
	
	/** 인증서 OID에 따른 인증서 용도 String 값 */
	private static final String[] OID_STRING = {
		"전자관인",
		"컴퓨터용",
		"전자특수관인",
		"공무원용",
		"스페셜 개인",
		"스페셜 개인서버",
		"스페셜 법인",
		"스페셜 서버",
		"범용개인",
		"범용개인서버",
		"범용기업",
		"범용서버",
		"증권/보험용",
		"신용카드용",
		"골드 개인서버",
		"실버 개인",
		"실버 법인",
		"범용기업",
		"범용개인",
		"특별등급(전자입찰)",
		"1등급인증서(서버)",
		"특별등급 법인",
		"은행개인",
		"증권/보험용",
		"신용카드용",
		"1등급(기관/단체)",
		"범용기업",
		"1등급(서버)",
		"특수목적용(기관/단체)",
		"특수목적용(법인)",
		"특수목적용(서버)",
		"특수목적용(개인)",
		"범용개인",
		"범용개인",
		"범용기업",
		"범용(서버)",
		"특수목적용(개인)",
		"특수목적용(법인)",
		"은행개인",
		"증권거래용",
		"신용카드용",
		"전자민원용",
		"범용개인",
		"은행기업",
		"은행개인",
		"범용기업",
		"용도제한용",
		"기업뱅킹용",
		"신용카드용",
		"공인인증기관",
		"전자거래 서명용(개인)",
		"전자거래 암호용(개인)",
		"전자거래 서명용(법인)",
		"전자거래 암호용(법인)",
		"전자거래 서명용(서버)",
		"전자거래 암호용(서버)",
		"전자무역 서명용(개인)",
		"전자무역 암호용(개인)",
		"전자무역 서명용(법인)",
		"전자무역 암호용(법인)",
		"전자무역 서명용(서버)",
		"전자무역 암호용(서버)",
		"은행/보험용",
		"증권/보험용",
		"신용카드용",
		"교육공무원용"
	};
	
	/**
	 * 인증서의 OID 값을 파싱하여 인증서 용도를 획득한다.
	 */
	public static String Parse(String s) {
		int nIndex = 0;
		
		for(nIndex = 0; nIndex < OID.length; nIndex++){
			if(OID[nIndex].compareTo(s) == 0){
				return OID_STRING[nIndex];
			}	
		}
		return null;
	}
	
	/**
	 * 인증서 유효기간을 분석 한다.
	 */
	public static int ParseTime(String Before, String After) throws Exception {
		Calendar NowTime = Calendar.getInstance();

				
		Date AfterDate = SDF.parse(After);		
		long time = (NowTime.getTimeInMillis() - AfterDate.getTime()) / (1000 * 60 * 60 * 24);

		if(time > 0){
			return -1;
		}
		else if(time > -31){
			return 0;
		}
		else{
			return 1;
		}
	}
	
	/**
	 * DN값을 파싱하여 원하는 데이터를 얻는다.
	 */
	public static String GetDataFormString(String Type, String DN) {
		String data = null;
		int nStartO = -1, nEndO = -1;
		
		nStartO = DN.indexOf(Type);
		if(nStartO >= 0) nStartO += Type.length();		
		
 		nEndO = DN.indexOf(",", nStartO );		
 		if(nEndO > 0) data = DN.substring(nStartO, nEndO);
 		else 		  data = DN.substring(nStartO);
		
 		return data;
	}
}
